package com.whfc.emp.dao;

import com.whfc.emp.dto.AppWarnEmpRecordDTO;
import com.whfc.emp.dto.AppWarnEmpRecordNumDTO;
import com.whfc.emp.dto.openapi.OpenApiEmpWarnDTO;
import com.whfc.emp.entity.AppEmpWarn;
import com.whfc.entity.dto.KeyAndSizeDTO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

public interface AppEmpWarnMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(AppEmpWarn record);

    int insertSelective(AppEmpWarn record);

    AppEmpWarn selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(AppEmpWarn record);

    int updateByPrimaryKey(AppEmpWarn record);

    /**
     * 查询报警信息
     *
     * @param deptId
     * @param state
     * @param ruleType
     * @param startTime
     * @param endTime
     * @return
     */
    List<AppWarnEmpRecordDTO> selectByDeptId(@Param("deptId") Integer deptId,
                                             @Param("state") Integer state,
                                             @Param("ruleType") Integer ruleType,
                                             @Param("startTime") Date startTime,
                                             @Param("endTime") Date endTime);

    /**
     * 查询一定时间内报警数
     *
     * @param deptIds
     * @param startTime
     * @param endTime
     * @return
     */
    Integer countWarnNum(@Param("deptIds") List<Integer> deptIds,
                         @Param("ruleType") Integer ruleType,
                         @Param("startTime") Date startTime,
                         @Param("endTime") Date endTime);

    /**
     * 查找人员报警列表
     *
     * @param deptId
     * @param handleState
     * @return
     */
    List<AppWarnEmpRecordDTO> selectEmpWarnList(@Param("deptId") Integer deptId,
                                                @Param("state") Integer handleState);

    /**
     * 报警列表
     *
     * @param empId     人员ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 报警列表
     */
    List<OpenApiEmpWarnDTO> selectOpenApiEmpWarnList(@Param("empId") Integer empId,
                                                     @Param("startTime") Date startTime,
                                                     @Param("endTime") Date endTime);

    /**
     * 人员报警数量
     *
     * @param deptId
     * @param state
     * @param startTime
     * @param endTime
     * @return
     */
    List<AppWarnEmpRecordNumDTO> countWarnTypeNum(@Param("deptId") Integer deptId,
                                                  @Param("state") Integer state,
                                                  @Param("startTime") Date startTime,
                                                  @Param("endTime") Date endTime);


    /**
     * 批量处理报警记录
     *
     * @param warnIdList
     * @param handleResult
     * @param handleRemark
     * @param userId
     * @param userName
     * @param phone
     */
    void batchUpdateState(@Param("warnIdList") List<Integer> warnIdList,
                          @Param("handleResult") String handleResult,
                          @Param("handleRemark") String handleRemark,
                          @Param("userId") Integer userId,
                          @Param("userName") String userName,
                          @Param("phone") String phone);

    /**
     * 删除报警记录
     *
     * @param warnIdList
     */
    void deleteLogicByObjectIds(@Param("warnIdList") List<Integer> warnIdList);

    /**
     * 聚合统计报警消息数量
     *
     * @param deptIds
     * @param startTime
     * @param endTime
     * @return
     */
    List<KeyAndSizeDTO> countWarnByType(@Param("deptIds") List<Integer> deptIds,
                                  @Param("startTime") Date startTime,
                                  @Param("endTime") Date endTime);

    List<AppWarnEmpRecordDTO> selectNewEmpWarnList(@Param("deptId")Integer deptId);

    /**
     * 查询指定规则最近N小时的报警记录
     *
     * @param ruleId 规则ID
     * @param minutes  分钟数
     * @return
     */
    List<AppEmpWarn> selectRecentWarnsByRuleId(@Param("ruleId") Integer ruleId,
                                               @Param("minutes") Integer minutes);
}